package com.newbee.utils;

import com.newbee.model.TraceNode;
import com.newbee.model.TraceNodeStack;

import javax.annotation.Nonnull;

/**
 * 节点链线程持有者：与TraceContextHolder平行，独立管理节点链
 */
public class TraceNodeStackHolder {

    // 线程私有：存储当前链路的节点链
    private static final ThreadLocal<TraceNodeStack> NODE_CHAIN = new ThreadLocal<>();

    /**
     * 获取当前线程的节点链
     */
    @Nonnull
    public static TraceNodeStack getOrInit(TraceNode traceNode) {
        TraceNodeStack traceNodeStack = NODE_CHAIN.get();
        if (traceNodeStack == null) {
            traceNodeStack = new TraceNodeStack(traceNode);
            NODE_CHAIN.set(traceNodeStack);
        }
        return traceNodeStack;
    }

    /**
     * 清空节点链（链路结束时调用，避免线程复用污染）
     */
    public static void clear() {
        NODE_CHAIN.remove();
    }
}